package cn.edu.swu.xgb;

import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.*;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import static cn.edu.swu.xgb.Message.DATE_FORMAT;

public class MessageServlet extends HttpServlet {
    private static final String MESSAGE_LIST_KEY = "messageList";

    @Override
    public void init() throws ServletException {
        // 获取应用上下文对象
        ServletContext context = this.getServletContext();

        // 检查留言列表是否已存在（防止多次初始化）
        if (context.getAttribute(MESSAGE_LIST_KEY) == null) {
            // 使用 Collections.synchronizedList 确保线程安全（进阶点）
            List<Message> messageList = Collections.synchronizedList(new ArrayList<>());

            //加载历史留言信息
            this.loadMessageFromFile(messageList);

            // 将列表存入应用范围 (ServletContext)
            context.setAttribute(MESSAGE_LIST_KEY, messageList);
            System.out.println("留言列表初始化完成，存储于 ServletContext。");
        }
    }

    private void loadMessageFromFile(List<Message> messageList) {
        File file = new File("temp/message.txt");

        // 如果文件不存在，则跳过加载
        if (!file.exists()) {
            System.out.println("留言文件不存在，跳过加载。");
            return;
        }

        try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
            String line;
            int count = 0;

            while ((line = reader.readLine()) != null) {
                // 跳过空行
                if (line.trim().isEmpty()) {
                    continue;
                }

                // 解析每行数据，格式为：name | content | timestamp
                String[] parts = line.split(" \\| ", 3);
                if (parts.length == 3) {
                    String name = parts[0];
                    String content = parts[1];
                    String timestampStr = parts[2];

                    try {
                        // 解析时间戳
                        Date timestamp = DATE_FORMAT.parse(timestampStr);

                        // 创建Message对象
                        Message message = createMessageWithTimestamp(name, content, timestamp);
                        messageList.add(message);
                        count++;
                    } catch (ParseException e) {
                        System.err.println("解析时间戳失败，跳过该行: " + line);
                        e.printStackTrace();
                    }
                } else {
                    System.err.println("数据格式错误，跳过该行: " + line);
                }
            }

            System.out.println("从文件加载了 " + count + " 条留言记录。");

        } catch (IOException e) {
            System.err.println("读取留言文件失败: " + e.getMessage());
            e.printStackTrace();
        }

    }
    private Message createMessageWithTimestamp(String name, String content, Date timestamp) {
        try {
            Message message = new Message(name, content);

            // 使用反射设置timestamp字段
            java.lang.reflect.Field timestampField = Message.class.getDeclaredField("timestamp");
            timestampField.setAccessible(true);
            timestampField.set(message, timestamp);

            return message;
        } catch (Exception e) {
            System.err.println("创建Message对象失败: " + e.getMessage());
            e.printStackTrace();
            // 如果反射失败，返回当前时间的消息
            return new Message(name, content);
        }
    }
    @Override
    public void destroy() {
        try {
            FileWriter writer = new FileWriter("temp/message.txt");
            ServletContext context = this.getServletContext();
            List<Message> messages = (List<Message>) context.getAttribute(MESSAGE_LIST_KEY);

            for(Message msg:messages) {
                String row = msg.getName() + " | " + msg.getContent() + " | " +msg.getFormattedTimestamp() + "\n";
                writer.write(row);
            }
            writer.flush();
            writer.close();
            System.out.println("保存留言信息成功！");
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
    // 1. 设置请求编码，处理中文乱码
    request.setCharacterEncoding("UTF-8");

    // 2. 获取 POST 参数
    String name = request.getParameter("name");
    String content = request.getParameter("message");

    // 简单的输入校验
    if (name != null && !name.trim().isEmpty() && content != null && !content.trim().isEmpty()) {

        // 3. 封装 Message 对象
        Message newMessage = new Message(name.trim(), content.trim());

        // 4. 获取共享的留言列表并添加新留言
        ServletContext context = this.getServletContext();
        @SuppressWarnings("unchecked")
        List<Message> messageList = (List<Message>) context.getAttribute(MessageServlet.MESSAGE_LIST_KEY);

        // 留言添加到列表的头部 (索引 0)，实现最新留言在上面
        messageList.add(0, newMessage);
    }

    // 5. 【关键】处理完数据后，重定向到 GET 请求，防止 F5 刷新导致重复提交
    response.sendRedirect("message");
}

protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

    // 1. 设置响应编码，确保输出的 HTML 页面正确显示中文
    response.setContentType("text/html;charset=UTF-8");

    // 2. 获取共享的留言列表
    ServletContext context = this.getServletContext();
    @SuppressWarnings("unchecked")
    List<Message> messageList = (List<Message>) context.getAttribute(MessageServlet.MESSAGE_LIST_KEY);

    // 3. 开始构建 HTML 响应
    response.getWriter().println("<!DOCTYPE html>");
    response.getWriter().println("<html><head><title>在线留言板 - 实验</title>");
    response.getWriter().println("<link rel='stylesheet' type='text/css' href='style.css'>");
    response.getWriter().println("</head><body>");

    // 4. 【展示历史留言】
    response.getWriter().println("<h2>历史留言 (" + messageList.size() + " 条)</h2>");
    response.getWriter().println("<table border='1' width='80%' id='msg-table'>");
    response.getWriter().println("<tr><th>昵称</th><th>留言内容</th><th>时间</th></tr>");

    // 遍历列表，动态生成表格行
    for (Message msg : messageList) {
        response.getWriter().println("<tr>");
        response.getWriter().println("<td>" + msg.getName() + "</td>");
        response.getWriter().println("<td>" + msg.getContent() + "</td>");
        response.getWriter().println("<td>" + msg.getFormattedTimestamp() + "</td>"); // 使用带时间戳的方法
        response.getWriter().println("</tr>");
    }

    response.getWriter().println("</table>");
    response.getWriter().println("</body></html>");
    }
}